package intermouse;

import java.io.Console;

/**
 * A hangyaírtó spray által lehelyezett mérget jelképező osztály.
 * 
 * @author Bendefy Zoltán
 * @version 1.0
 * @since 2013-03-23
 */
public class Poison extends Malicious {
	/**
	 * Azt tároljuk benne, hogy a méreg hány körig él még.
	 */
	private int countdown;

	/**
	 * Konstruktor
	 * 
	 * A Poison osztály konstruktora.
	 */
	Poison() {
		super();
		countdown = 0;
	}

	/**
	 * Viszaadja, hogy még hány körig fog működni a méreg.
	 * 
	 * Viszaadja, hogy még hány körig fog működni a méreg. 
	 * Ha ez az érték 0 (vagy kisebb), akkor lehet törölni az objektumot.
	 * 
	 * @return A hátralevő körök számát adja vissza.
	 *         
	 */
	public int getCountdown() {
		return countdown;
	}

	/**
	 * Ebben a kívülről hívott metódusban futnak le a méreg objektum körben
	 * végzett tevékenységei.
	 * 
	 * Ez a függvény felelős azért, hogy a méreg objektum minden, az adott
	 * körben elvégzendő tevékenységet végrehajtson. Ebben zajlik le a támadás,
	 * a countdown figyelése, stb.
	 * 
	 * @return A függvény void-dal tér vissza, miután minden cselekvést
	 *         elvégzett.
	 */
	public void beginRound() {
		System.out.println(">> Poison.beginRound() : void");
		
		if (getField() == null) 
		{
			System.out.println("Figyelem! Az objektum field-je null!");
			return;
		}
		if (countdown <= 0) return;
		
		if (countdown == 0)
			TestCommandParser.log("Poison vanishes at "+field.toString()+".");
		
		beginAttack();
		countdown--;
		TestCommandParser.log("Poison countdown decreases to " + ((Integer)countdown).toString() + ".");
		
		System.out.println("<< return");
	}

	/**
	 * Ebben a kívülről hívott metódusban tudja a hangya lekérdezni, hogy
	 * léphet-e ide.
	 * 
	 * Ez a metódus a FieldObject-ből származik, és azért felelős, hogy
	 * hangyának megmondja, hogy ráléphet-e a mezőre, amelyen ez az objektum
	 * van.
	 * 
	 * @param ant
	 *            A metódus megjapja a hangyát, aki az objektum mezőjére akar
	 *            lépni, és üzenhet neki a függvényein keresztül
	 * @return A függvény egy boolean-al tér vissza, ami megmondja, hogy a
	 *         hangya ráléphet-e az adott mezőre. A méreg objektumnál ez
	 *         engedélyezett (true-val tér vissza)
	 */
	public boolean canStep(Ant ant) {
		System.out.println(">> Poison.canStep(Ant) : boolean");
		System.out.println("<< return");
		return true;
	}
	
	/**
	 * Ebben a kívülről hívott metódusban tudja a kő lekérdezni, hogy
	 * léphet-e ide.
	 * 
	 * Ez a metódus a FieldObject-ből származik, és azért felelős, hogy
	 * kőnek megmondja, hogy ráléphet-e a mezőre, amelyen ez az objektum
	 * van.
	 * 
	 * @param ant
	 *            A metódus megjapja a követ, aki az objektum mezőjére akar
	 *            lépni, és üzenhet neki a függvényein keresztül
	 * @return A függvény egy boolean-al tér vissza, ami megmondja, hogy a
	 *         kő ráléphet-e az adott mezőre.
	 */
	public boolean canStep(Stone stone, boolean isFirst, int direction) {
		System.out.println(">> Poison.canStep(Stone) : boolean");
		System.out.println("<< return");
		return true;
	}
	
	/**
	 * Ezzel a metódussal lehet felhelyezni a poison objektumot a játéktérre
	 * 
	 * Ez a metódus helyezi fel az objektumot a pályára. Beállítja a field
	 * változó értékét a paraméterben megadottra, majd egyéb inicializálásokat
	 * végez.
	 * 
	 * @param field
	 *            A mező amelyre az objektumot helyezni fogjuk
	 * @return A függvény egy void-dal tér vissza
	 */
	public void spawn(Field field) {
		System.out.println(">> Malicious.spawn(Field) : void");
		
		if (!respawnable && getField() != null) return;
		if (countdown > 0) 	return;
		
		countdown = 8; //előre specifikált érték.
		setField(field);
		
		TestCommandParser.log("Spawned Poison at "+field.toString()+".");
		
		System.out.println("<< return");
	}
}